要想实现上述效果,需要准备三张图:
然后让控件派生自 ImageView 类,这样才能方便地更改它的源文件内容。
想让图片上下跳动,可以利用 ValueAnimator 实时产生一个 0~200 的数值,然后让当前图片的位置实时向上移动 ValueAnimator 的动态值的高度即可。要让图片的位置实时向上移动,就需要先拿到初始状态下图片的位置。重写 onLayout(boolean changed, int left, int top, int right, int bottom) 函数,就可以拿到控件的初始高度 mTop,之后在每次 ValueAnimator 的动态值到来时,计算出当前控件的 top 位置,并将控件移动到这个位置就可以了。
即:自定义一个控件 LoadingImageView, 派生自 ImageView,然后重写 onLayout() 函数,拿到控件的初始 top 值。代码如下:
由于我们需要在刚展示图片时就开始动画,所以将动画的操作全部写在 init() 函数中。代码如下:
通过 (mTop - dx) 得到当前控件相对初始坐标上移 dx 距离后的最新坐标点,然后调用 setTop(int top) 函数将控件移动到当前位置。
接下来需要监听动画的开始和重复。当动画开始时,图片应该设置为 loading_text_1.png;在重复时,每重复一次应该更换一张图片。代码如下:
在更改图片时,我们使用 mCurImgIndex 来累加当前重复的次数,通过与图片总张数 (mImgCount) 取余数,来决定这次重复使用的是哪张图片。
使用控件:
LoadingImageView 的完整代码如下: